package com.cloud.class05.test;

import java.util.concurrent.CompletableFuture;

// 模拟边打王者荣耀边下载资源过程，一个异步任务下载资源，一个异步任务打王者荣耀
public class CompletableFutureExample {
    public static void main(String[] args) {
//        supplyAsync()方法作用：异步执行任务
//        创建一个异步任务CompletableFuture对象，用于下载资源
//        runAsync()方法作用：异步执行任务
        CompletableFuture<Void> downloadResources = CompletableFuture.runAsync(() -> {
            System.out.println("开始下载资源。。。。。。。。。。。。。");
            try {
                Thread.sleep(5000);//模拟下载资源过程
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("下载资源完成");

        });


        //        创建一个异步任务CompletableFuture对象，用于下载资源
        CompletableFuture<Void> playGame = CompletableFuture.runAsync(() -> {
            System.out.println("开始打游戏。。。。。。。。。。。。。");
            try {
                Thread.sleep(10000);//模拟打游戏过程
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("游戏完成");

        });
//        使用thenAccept()方法在下载完成后执行通知操作
//        Void类作用：表示无返回值
        downloadResources.thenAccept((Void) -> {
            System.out.println("下载完成，通知打游戏线程");
        });

//     join()方法作用：等待所有任务完成
//        allOf()返回一个新的CompletableFuture，当所有给定的ComplettableFuture完成时，该新的ComplextableFuture已完成。
//        如果任何给定的CompletableFutures异常完成，那么返回的ComplettableFuture也会这样做，
//        CompletionException将此异常作为其原因。否则，给定CompletableFutures的结果（如果有的话）
//        不会反映在返回的Completable未来中，而是可以通过单独检查它们来获得。如果未提供CompletableFutures，
//        则返回值为null的Completable期货。该方法的应用程序之一是在继续程序之前等待一组独立的CompletableFutures的完成，
//        如：Completable未来。allOf（c1，c2，c3）.join（）；。
        CompletableFuture.allOf(downloadResources, playGame).join();

    }
}
